package com.example.demo2;

import com.example.entity.UserInfo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 事件处理类
 */
public class EventManager {


    /**
     * 事件的类型 其中包含 mq消息 和 message消息
     */
    public enum EventType {
        MQ, MESSAGE
    }

    /**
     * 消息集合
     */
    Map<Enum<EventType>, List<EventListener>> listMap = new ConcurrentHashMap<>();

    public EventManager(Enum<EventType>... operations) {
        for (Enum<EventType> operation : operations) {
            this.listMap.put(operation, new ArrayList<>());
        }
    }

    /**
     * 订阅
     *
     * @param eventTypeEnum 事件类型
     * @param eventListener 监听对象
     */
    public void subscribe(Enum<EventType> eventTypeEnum, EventListener eventListener) {
        this.listMap.get(eventTypeEnum).add(eventListener);
    }

    /**
     * 取消订阅
     *
     * @param eventTypeEnum 事件类型
     * @param eventListener 监听对象
     */
    public void unsubscribe(Enum<EventType> eventTypeEnum, EventListener eventListener) {
        this.listMap.get(eventTypeEnum).remove(eventListener);
    }

    /**
     * 给所有的  事件监听器 发送消息通知
     *
     * @param userInfo  通知内容
     */
    public void notify(UserInfo userInfo) {
        listMap.forEach((eventTypeEnum, eventListeners) -> {
            eventListeners.forEach(eventListener -> {
                eventListener.listener(userInfo);
            });
        });
    }
}
